package org.farm2.tools.bean;

import com.alibaba.fastjson2.util.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.modelmapper.ModelMapper;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;

public class FarmBeanUtils {
    /**
     * 讲map中的数据拷贝到对象中(map的key不分大小写)
     *
     * @param map
     * @param bean
     */
    public static Object copyProperties(Map<String, ?> map, Object bean) {
        Map<String, Object> upperCaseMap = new java.util.HashMap<>();
        for (Map.Entry<String, ?> entry : map.entrySet()) {
            upperCaseMap.put(entry.getKey().toUpperCase(), entry.getValue());
        }
        // 获取目标对象的所有字段
        Field[] fields = bean.getClass().getDeclaredFields();
        for (Field field : fields) {
            String fieldName = field.getName().toUpperCase();
            if (upperCaseMap.containsKey(fieldName)) {
                try {
                    // 设置字段可访问
                    field.setAccessible(true);
                    // 将 Map 中的值赋给目标对象的字段
                    field.set(bean, upperCaseMap.get(fieldName));
                } catch (IllegalAccessException e) {
                    e.printStackTrace(); // 在生产环境中应该更优雅地处理异常
                }
            }
        }
        return bean;
    }


    /**
     * 将bean的属性拷贝到map中(key会转换为大写)
     *
     * @param bean
     * @param map
     */
    public static Map<String, Object> copyProperties(Object bean, Map<String, Object> map) {
        Field[] fields = bean.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {
                // 设置字段可访问
                field.setAccessible(true);
                // 获取字段名和字段值
                String fieldName = field.getName();
                Object fieldValue = field.get(bean);
                if (fieldValue != null) {
                    // 将字段名和字段值放入Map中
                    map.put(fieldName.toUpperCase(), fieldValue);
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
        return map;
    }


    /**当value值为空时，执行方法setter，设置默认值defaultValue
     * @param value
     * @param defaultValue
     * @param setter
     */
    public static void runFunctionByBlank(Object value, String defaultValue, Consumer<String> setter) {
        boolean isNull = false;
        if (value instanceof String) {
            isNull = StringUtils.isBlank((String) value);
        } else {
            isNull = Objects.isNull(value);
        }
        if (isNull) {
            setter.accept(defaultValue);
        }
    }

    /**
     * 将对象sObj的属性拷贝到tObj中
     *
     * @param sObj 來源
     * @param tObj 目標
     */
    public static <T> T copyProperties(Object sObj, T tObj) {
        if (sObj == null) {
            return null;
        }
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.map(sObj, tObj);
        return tObj;
    }

    /**
     * 通过class获取对象实例
     *
     * @param implclass  如：org.farm2.tools.bean.FarmBeanUtils
     * @return
     * @throws Exception
     */
    public static Object getInstance(String implclass) throws Exception {
        Class<?> clazz = null;
        clazz = Class.forName(implclass);
        // 创建实例（假设该类有一个无参构造函数）
        return clazz.getDeclaredConstructor().newInstance();
    }
}
